/*底层IIC驱动代码 及 EEPROM上层代码*/

#include "iic.h"

void IIC_Delay(unsigned char i)
{
	do{_nop_();}
	while(i--);        
}

//IIC起始条件
void IIC_Start(void)
{
	IIC_SDA = 1;	//拼接其他块，确保默认是1
	IIC_SCL = 1;	IIC_Delay(DELAY_TIME);
	IIC_SDA = 0;	IIC_Delay(DELAY_TIME); //时序上先拉低
	IIC_SCL = 0;	
}

//总线停止条件
void IIC_Stop(void)
{
	IIC_SDA = 0;	//确保默认0，保证由低电平拉高至高电平
	IIC_SCL = 1;	IIC_Delay(DELAY_TIME);
	IIC_SDA = 1;	IIC_Delay(DELAY_TIME);
}

//IIC发送应答 AckBit 应答位，0为应答，1为非应答
void IIC_SendAck(bit AckBit)
{
	IIC_SCL = 0;	
	IIC_SDA = AckBit; IIC_Delay(DELAY_TIME);  //给应答就是0，不给应答就是1
	IIC_SCL = 1; 	  IIC_Delay(DELAY_TIME);
	IIC_SCL = 0;
	IIC_SDA = 1;      IIC_Delay(DELAY_TIME);
}

//等待应答(接收应答)  ackbit 答位，0为应答，1为非应答
bit IIC_WaitAck(void)
{
	bit ackbit;
	IIC_SDA = 0;	//先释放SDA
	IIC_SCL  = 1;	IIC_Delay(DELAY_TIME);	//高电平期间读取SDA
	ackbit = IIC_SDA;	//读到什么就返回什么数据
	IIC_SCL = 0;	IIC_Delay(DELAY_TIME);
	return ackbit;	//返回0，代表有应答，返回1，代表无应答
}

//通过IIC总线发送数据
/**
  * @brief	I2C发送一个字节数据
  * @param	Byte 要发送的字节
  * @retval	无
  */
void IIC_SendByte(unsigned char Byte)
{
	unsigned char i;

	for(i=0; i<8; i++)
	{
		IIC_SCL  = 0;		IIC_Delay(DELAY_TIME);
		//将数据放到SDA总线上
		IIC_SDA = Byte & (0x80 >> i);	//把Byte最高位取出，赋值给I2C_SDA,依次从高到底
			IIC_Delay(DELAY_TIME);
		IIC_SCL = 1;	IIC_Delay(DELAY_TIME);
	}
	IIC_SCL  = 0;  
}


//从IIC总线上接收数据
unsigned char IIC_RecByte(void)
{
	unsigned char i, Byte = 0x00;
	
	IIC_SDA = 1;	//接收之前，先把I2C_SDA置1，释放总线
	for(i=0; i<8; i++)
	{   
		IIC_SCL = 1;	IIC_Delay(DELAY_TIME);	//拉高SCL，SCL读取SDA
		if(IIC_SDA == 1) { Byte |= (0x80>>i); }
			/*如果读取到的SDA为1，把Byte最高位置1，如果读取到的SDA为0，不处理，默认最高位为0，放在循环里从高位到低位依次读取*/
		IIC_SCL = 0;	IIC_Delay(DELAY_TIME);	//拉低SCL，结束当前循环
	}
	return Byte;    
}
//IIC基本时序 6个模块-------------------------------------------------------------------------------
//IIC驱动的上层代码编写


/*
 * 输入参数：0x01-光敏电阻接AIN1通道, 0x03-滑动变阻器接AIN3通道(电压读取)
 * 输出参数：0~255, 转换成0~5V
*/
unsigned char PCF8591_ADC_Read(unsigned char address)
{
	unsigned char Ret_Data;
	IIC_Start();
	IIC_SendByte(0x90);	//从机地址+读取
	IIC_WaitAck();		//接受应答
	IIC_SendByte(address);	//数据的地址	
	IIC_WaitAck();
	IIC_Stop();

	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	Ret_Data = IIC_RecByte();
	IIC_Stop();
//	Ret_Data = Ret_Data*1.961;
	return Ret_Data;
} 


// 1V  57
// 4V  222

void DAC_Out(uchar dat) //输出电压
{
	IIC_Start();
	IIC_SendByte(0x48<<1);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}

uchar E2Read(uchar add) //EEPROM读取
{
	uchar temp;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();

	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	temp=IIC_RecByte();
	IIC_Stop();
	return temp;
}

void E2Write(uchar add,uchar dat)  //EEPROM写入
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}
